import { NzMessageService } from 'ng-zorro-antd/message';
import { NzUploadFile } from 'ng-zorro-antd/upload';

import { map } from 'rxjs/operators';
import { FileApiService } from '../api/file-api.service';


/**
 * Nz-Upload 的支持类，配合 nz-upload 使用，每个 nz-upload 搭配一个 FileUploder 实例。
 * 使用方法：
 * 1：nz-upload 的 [nzRemove] 绑定 removeFile *
 * 2：数据初始化时，调用 init 方法，初始化文件列表
 * 3：重置时，调用 rest 方法，重置文件列表，同时删除已上传的文件
 * 4：nz-upload 的 [nzFileList] 绑定 fileList
 */
export class FileUploder {
  fileApi: FileApiService;
  fileList: NzUploadFile[];
  message: NzMessageService;

  /**
   *
   * @param fileApi 文件交互API，必需实现 removeFile(file: NzUploadFile) 方法；
   * @param message NzMessageService
   */
  constructor(fileApi: FileApiService, message: NzMessageService) {
    this.fileApi = fileApi;
    this.fileList = [];
    this.message = message;
  }

  /**
   * 删除文件
   * @param file 需要删除的文件
   * @returns
   */
  public removeFile = (file: NzUploadFile) => {
    let url = ''
    if (file.response) {
      url = file.response.data.url
    } else {
      url = file.url
    }
    return this.fileApi.delete(url).pipe(map(item => item ? false : true));
  }

  /**
   * 重置文件列表。若列表中有已上传的文件则删除该文件
   */
  public rest() {
    if (this.fileList.length > 0) {
      for (const file of this.fileList) {
        this.removeFile(file).subscribe(
          item => {
            this.message.success('文件删除成功')
          },
          err => {
            console.error(err);
            this.message.error('文件删除错误')
          }
        )
      }
    }
  }

  /**
   * 根据传入的文件访问URL，初始化文件列表
   * @param urls 文件访问路径集合
   */
  public init(urls: string[]) {
    if (urls && urls.length > 0) {
      for (const url of urls) {
        if (url) {
          const fileName = url.slice(url.lastIndexOf('/') + 1);
          this.fileList.push({
            uid: '-1',
            name: fileName,
            status: 'done',
            url: url,
          })
        }
      }
    }
  }

}
